package com.ziytek.web.citizen.util;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.math.NumberUtils;
import org.springframework.util.CollectionUtils;

import java.math.RoundingMode;
import java.util.List;

/**
 * @author fenghx
 * @version v1.0
 * @className NumberUtil
 * @description 功能描述
 * @date 2023/7/11 16:09
 **/
@Slf4j
public class NumberToUtils {


    /***
     * 精确到小数点后2位
     * @param floatValue floatValue
     * @return Float
     * */
    public static Integer toInt(String floatValue) {
        if (floatValue == null) {
            return NumberUtils.INTEGER_ZERO;
        }
        return NumberUtils.toScaledBigDecimal(floatValue).intValue();
    }

    /***
     * 精确到小数点后2位
     * @param floatValue floatValue
     * @return Float
     * */
    public static Float toFloat2Decimal(Float floatValue) {
        if (floatValue == null) {
            return NumberUtils.FLOAT_ZERO;
        }
        return NumberUtils.toScaledBigDecimal(floatValue).floatValue();
    }

    /***
     * 精确到小数点后几位
     * @param floatValue floatValue
     * @param scale scale
     * @return Float
     * */
    public static Float toFloat2Decimal(Float floatValue, int scale) {
        if (floatValue == null) {
            return NumberUtils.FLOAT_ZERO;
        }
        return NumberUtils.toScaledBigDecimal(floatValue, scale, RoundingMode.HALF_EVEN).floatValue();
    }

    /***
     * 精确到小数点后几位
     * @param doubleValue doubleValue
     * @param scale scale
     * @return Float
     * */
    public static Float doubleToFloat2Decimal(Double doubleValue, int scale) {
        if (doubleValue == null) {
            return NumberUtils.FLOAT_ZERO;
        }
        return NumberUtils.toScaledBigDecimal(doubleValue, scale, RoundingMode.HALF_EVEN).floatValue();
    }


    /***
     * 精确到小数点后2位
     * @param doubleValue doubleValue
     * @return Double
     * */
    public static Double toFloat2Decimal(Double doubleValue) {
        if (doubleValue == null) {
            return NumberUtils.DOUBLE_ZERO;
        }
        return NumberUtils.toScaledBigDecimal(doubleValue).doubleValue();
    }

    /***
     * 精确到小数点后几位
     * @param doubleValue doubleValue
     * @param scale scale
     * @return Double
     * */
    public static Double toFloat2Decimal(Double doubleValue, int scale) {
        if (doubleValue == null) {
            return NumberUtils.DOUBLE_ZERO;
        }
        return NumberUtils.toScaledBigDecimal(doubleValue, scale, RoundingMode.HALF_EVEN).doubleValue();
    }


    /***
     * 求取平均值
     * @param floatList 求取平均值列表数据
     * @return 平均值
     * */
    public static Float getAverage(List<Float> floatList) {
        if (CollectionUtils.isEmpty(floatList)) {
            return NumberUtils.FLOAT_ZERO;
        }

        double average = floatList.stream().mapToDouble(x -> x).summaryStatistics().getAverage();
        return StringUtil.toFloat(String.valueOf(average));
    }

    /***
     * 小数点后几位
     * @param floatValue floatValue
     * @return 小数点后几位
     * */
    public static Float getDecimalPoint(Float floatValue, double num) {
        //double pointDouble = num > NumConstant.DOUBLE_ZERO ? Math.pow(NumConstant.DOUBLE_TEN, num) : NumConstant.DOUBLE_HUNDRED;
        // float point = Float.parseFloat(String.valueOf(pointDouble));
        //return Math.round(floatValue * NumConstant.FLOAT_HUNDRED) / point;

        return toFloat2Decimal(floatValue, (int) num);
    }

    /***
     * 小数点后几位
     * @param doubleValue doubleValue
     * @return 小数点后几位
     * */
    public static Double getDecimalPoint(Double doubleValue, double num) {
        //double pointDouble = num > NumConstant.DOUBLE_ZERO ? Math.pow(NumConstant.DOUBLE_TEN, num) : NumConstant.DOUBLE_HUNDRED;
        //double point = Double.parseDouble(String.valueOf(pointDouble));
        //return Math.round(doubleValue * NumConstant.DOUBLE_HUNDRED) / point;

        return toFloat2Decimal(doubleValue, (int) num);
    }
}
